section .data
sonmsg db 'Hello, we are son!', 0
sonmsglen equ $ - msg

parentmsg db 'Hello, we are parent!', 0
parentmsglen equ $ - msg

section .text
global _start

_start:
    ; 调用sys_fork系统调用创建子进程
    mov eax, 0x02 ; sys_fork的系统调用号
    int 0x80 ; 触发系统调用

    ; 检查返回值
    test eax, eax ; 如果eax为0，则表示当前进程为子进程
    jz child_process

    ; 如果eax不为0，则表示当前进程为父进程
    ; 在此处可对父进程进行操作
    mov ebx, eax ; 将子进程的进程ID存储在ebx中
    mov eax, 0x04 ; sys_write系统调用号
    mov ecx, 0x01 ; 标准输出文件描述符
    mov edx, msglen ; 输出长度
    int 0x80 ; 触发系统调用

    ; 关闭文件句柄等操作

    ; 程序退出
    mov eax, 0x01 ; sys_exit系统调用号
    xor ebx, ebx ; 返回值为0
    int 0x80 ; 触发系统调用

child_process:
    ; 在此处可对子进程进行操作
    mov eax, 0x04 ; sys_write系统调用号
    mov ecx, 0x01 ; 标准输出文件描述符
    mov edx, msglen ; 输出长度
    int 0x80 ; 触发系统调用

    ; 关闭文件句柄等操作

    ; 子进程退出
    xor eax, eax ; 返回值为0
    xor ebx, ebx ; 返回值为0
    int 0x80 ; 触发系统调用